#ifndef __JEFFZ_H_e13f35be_bfad_40d7_8e39_15214186a2d6__
#define __JEFFZ_H_e13f35be_bfad_40d7_8e39_15214186a2d6__

#ifdef __cplusplus
extern "C" {
#endif

#define ___ALIGN_UP(size, n)  (((size)+((n)-1))&(~((n)-1)))
#define ___ALIGN_DN(size, n)  ((size)&(~(n-1)))

#define __ALIGN4(size)  ___ALIGN_UP((size),4)
#define __ALIGN8(size)  ___ALIGN_UP((size),8)
#define __ALIGN16(size)  ___ALIGN_UP((size),16)
#define __ALIGN32(size)  ___ALIGN_UP((size),32)

#ifdef _WIN32
#define llong  __int64 
#define LLONG_C(c)   c
#else
#define llong  long long int
#define LLONG_C(c)   c ## ULL
#endif

#define JD_NO_TYPE      LLONG_C(0x0000000000000001)
#define JD_NO_INDEX     LLONG_C(0x0000000000000002)
#define JD_NO_ADDR      LLONG_C(0x0000000000000004)
#define JD_NO_DWORD     LLONG_C(0x0000000000000008)
#define JD_NO_WORD      LLONG_C(0x0000000000000010)
#define JD_NO_BYTE      LLONG_C(0x0000000000000020)
#define JD_NO_CHAR      LLONG_C(0x0000000000000040)
#define JD_HAS_QWORD    LLONG_C(0x0000000000000080)

#define JD_DATA_NOPAD   LLONG_C(0x0000000000000100)
#define JD_DATA_PACK    LLONG_C(0x0000000000000200)
#define JD_DATA_1       LLONG_C(0x0000000000000400)
#define JD_DATA_2       LLONG_C(0x0000000000000800)

#define JD_QWORD_HEX    LLONG_C(0x0000000000000000) /*default*/
#define JD_QWORD_DEC    LLONG_C(0x0000000000001000)
#define JD_QWORD_OCT    LLONG_C(0x0000000000002000)
#define JD_QWORD_BIN    LLONG_C(0x0000000000003000)

#define JD_DWORD_HEX    LLONG_C(0x0000000000000000) /*default*/
#define JD_DWORD_DEC    LLONG_C(0x0000000000004000)
#define JD_DWORD_OCT    LLONG_C(0x0000000000008000)
#define JD_DWORD_BIN    LLONG_C(0x000000000000C000)

#define JD_WORD_HEX     LLONG_C(0x0000000000000000) /*default*/
#define JD_WORD_DEC     LLONG_C(0x0000000000010000)
#define JD_WORD_OCT     LLONG_C(0x0000000000020000)
#define JD_WORD_BIN     LLONG_C(0x0000000000030000)

#define JD_BYTE_HEX     LLONG_C(0x0000000000000000) /*default*/
#define JD_BYTE_DEC     LLONG_C(0x0000000000040000)
#define JD_BYTE_OCT     LLONG_C(0x0000000000080000)
#define JD_BYTE_BIN     LLONG_C(0x00000000000C0000)

#define JD_DATA_HEX     JD_QWORD_HEX | JD_DWORD_HEX | JD_WORD_HEX | JD_BYTE_HEX
#define JD_DATA_DEC     JD_QWORD_DEC | JD_DWORD_DEC | JD_WORD_DEC | JD_BYTE_DEC
#define JD_DATA_OCT     JD_QWORD_OCT | JD_DWORD_OCT | JD_WORD_OCT | JD_BYTE_OCT
#define JD_DATA_BIN     JD_QWORD_BIN | JD_DWORD_BIN | JD_WORD_BIN | JD_BYTE_BIN

#define JD_QWORD_SIGNED LLONG_C(0x0000000000100000)
#define JD_DWORD_SIGNED LLONG_C(0x0000000000200000)
#define JD_WORD_SIGNED  LLONG_C(0x0000000000400000)
#define JD_BYTE_SIGNED  LLONG_C(0x0000000000800000)
#define JD_DATA_SIGNED  JD_QWORD_SIGNED | JD_DWORD_SIGNED | JD_WORD_SIGNED | JD_BYTE_SIGNED

#define JD_QWORD_LOWER  LLONG_C(0x0000000001000000)
#define JD_DWORD_LOWER  LLONG_C(0x0000000002000000)
#define JD_WORD_LOWER   LLONG_C(0x0000000004000000)
#define JD_BYTE_LOWER   LLONG_C(0x0000000008000000) 
#define JD_DATA_LOWER   JD_QWORD_LOWER | JD_DWORD_LOWER | JD_WORD_LOWER | JD_BYTE_LOWER

#define JD_TYPE_UPPER   LLONG_C(0x0000000010000000)
#define JD_TYPE_SHORT   LLONG_C(0x0000000020000000)
#define JD_TYPE_FULL    LLONG_C(0x0000000040000000)
#define JD_TYPE_1       LLONG_C(0x0000000080000000)

#define JD_INDEX_LOOP   LLONG_C(0x0000000000000000) /*default*/
#define JD_INDEX_LONG   LLONG_C(0x0000000100000000)
#define JD_INDEX_HEX    LLONG_C(0x0000000000000000) /*default*/
#define JD_INDEX_DEC    LLONG_C(0x0000000200000000)
#define JD_INDEX_1      LLONG_C(0x0000000400000000)
#define JD_INDEX_2      LLONG_C(0x0000000800000000)

#define JD_ADDR_HEX     LLONG_C(0x0000000000000000) /*default*/
#define JD_ADDR_DEC     LLONG_C(0x0000001000000000)
#define JD_ADDR_REL     LLONG_C(0x0000002000000000)
#define JD_ADDR_INDEX   LLONG_C(0x0000004000000000)
#define JD_ADDR_UPPER   LLONG_C(0x0000008000000000)

int jeff_dump(FILE *out_fp, char *out_sp, void *in_ptr, int in_size, int in_wide, llong in_flags);

#ifdef __cplusplus
}
#endif

#endif

